﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace cstdx.Internal;

public static class EncodingConverter
{
	// GBK编码（注意：.NET中的GBK实际对应Windows-1252，这里使用正确的代码页）
	private static readonly Encoding GbkEncoding = Encoding.GetEncoding("GBK");
	// Big5编码
	private static readonly Encoding Big5Encoding = Encoding.GetEncoding("Big5");
	// UTF-8编码
	private static readonly Encoding Utf8Encoding = Encoding.UTF8;

	/// <summary>
	/// 将UTF-8字节数组转换为GBK编码的字符串
	/// </summary>
	public static string Utf8ToGbk(byte[] text)
	{
		// 查找第一个0x00字节的位置
		int pos = Array.IndexOf(text, (byte)0x00);
		if (pos >= 0)
		{
			// 截断到0x00字节之前
			byte[] temp = new byte[pos];
			Array.Copy(text, temp, pos);
			text = temp;
		}

		// 先将UTF-8字节转换为字符串（得到Unicode）
		string utf8String = Utf8Encoding.GetString(text);
		// 再将Unicode转换为GBK字节
		byte[] gbkBytes = GbkEncoding.GetBytes(utf8String);
		// 转换为字符串并替换空字符
		return GbkEncoding.GetString(gbkBytes).Replace("\0", "");
	}

	/// <summary>
	/// 版本1：将UTF-8字节数组转换为GBK编码的字符串
	/// </summary>
	public static string V1Utf8ToGbk(byte[] text)
	{
		// 先将UTF-8字节转换为字符串（得到Unicode）
		string utf8String = Utf8Encoding.GetString(text);
		// 再将Unicode转换为GBK字节
		byte[] gbkBytes = GbkEncoding.GetBytes(utf8String);
		// 转换为字符串并替换空字符
		return GbkEncoding.GetString(gbkBytes).Replace("\0", "");
	}

	/// <summary>
	/// 将GBK编码的字节数组转换为UTF-8编码的字节数组
	/// </summary>
	public static byte[] DecodeGBK(byte[] s)
	{
		// 先将GBK字节转换为Unicode字符串
		string gbkString = GbkEncoding.GetString(s);
		// 再将Unicode转换为UTF-8字节
		return Utf8Encoding.GetBytes(gbkString);
	}

	/// <summary>
	/// 将UTF-8编码的字节数组转换为GBK编码的字节数组
	/// </summary>
	public static byte[] EncodeGBK(byte[] s)
	{
		// 先将UTF-8字节转换为Unicode字符串
		string utf8String = Utf8Encoding.GetString(s);
		// 再将Unicode转换为GBK字节
		return GbkEncoding.GetBytes(utf8String);
	}

	/// <summary>
	/// 将Big5编码的字节数组转换为UTF-8编码的字节数组
	/// </summary>
	public static byte[] DecodeBig5(byte[] s)
	{
		// 先将Big5字节转换为Unicode字符串
		string big5String = Big5Encoding.GetString(s);
		// 再将Unicode转换为UTF-8字节
		return Utf8Encoding.GetBytes(big5String);
	}

	/// <summary>
	/// 将UTF-8编码的字节数组转换为Big5编码的字节数组
	/// </summary>
	public static byte[] EncodeBig5(byte[] s)
	{
		// 先将UTF-8字节转换为Unicode字符串
		string utf8String = Utf8Encoding.GetString(s);
		// 再将Unicode转换为Big5字节
		return Big5Encoding.GetBytes(utf8String);
	}
}
